package br.com.hs.nfe.common.enumeration;

/**
 * Enumeração de códigos de situação tributária da COFINS.
 * @author Ranlive Hrysyk
 */
public enum COFINSEnum {

    /**
     * 01 - Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo)
     */
    COFINS_01("01", "COFINS 01 - Operação Tributável - Base de Cálculo = Valor da Operação Alíquota Normal (Cumulativo/Não Cumulativo)"),
    /**
     * 02 - Operação Tributável - Base de Cálculo = Valor da Operação (Alíquota Diferenciada)
     */
    COFINS_02("02", "COFINS 02 - Operação Tributável - Base de Cálculo = Valor da Operação (Alíquota Diferenciada)"),
    /**
     * 03 - Operação Tributável - Base de Cálculo = Quantidade Vendida x Alíquota por Unidade de Produto
     */
    COFINS_03("03", "COFINS 03 - Operação Tributável - Base de Cálculo = Quantidade Vendida x Alíquota por Unidade de Produto"),
    /**
     * 04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero)
     */
    COFINS_04("04", "COFINS 04 - Operação Tributável - Tributação Monofásica - (Alíquota Zero)"),
    /**
     * 06 - Operação Tributável - Alíquota Zero
     */
    COFINS_06("06", "COFINS 06 - Operação Tributável - Alíquota Zero"),
    /**
     * 07 - Operação Isenta da Contribuição
     */
    COFINS_07("07", "COFINS 07 - Operação Isenta da Contribuição"),
    /**
     * 08 - Operação sem Incidência da Contribuição
     */
    COFINS_08("08", "COFINS 08 - Operação sem Incidência da Contribuição"),
    /**
     * 09 - Operação com Suspensão da Contribuição
     */
    COFINS_09("09", "COFINS 09 - Operação com Suspensão da Contribuição"),
    /**
     * 49 - Outras Operações de Saída
     */
    COFINS_49("49", "COFINS 49 - Outras Operações de Saída"),
    /**
     * 50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno
     */
    COFINS_50("50", "COFINS 50 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Tributada no Mercado Interno"),
    /**
     * 51 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno
     */
    COFINS_51("51", "COFINS 51 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita Não Tributada no Mercado Interno"),
    /**
     * 52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação
     */
    COFINS_52("52", "COFINS 52 - Operação com Direito a Crédito - Vinculada Exclusivamente a Receita de Exportação"),
    /**
     * 53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno
     */
    COFINS_53("53", "COFINS 53 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno"),
    /**
     * 54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação
     */
    COFINS_54("54", "COFINS 54 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas no Mercado Interno e de Exportação"),
    /**
     * 55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação
     */
    COFINS_55("55", "COFINS 55 - Operação com Direito a Crédito - Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação"),
    /**
     * 56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação
     */
    COFINS_56("56", "COFINS 56 - Operação com Direito a Crédito - Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação"),
    /**
     * 60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno
     */
    COFINS_60("60", "COFINS 60 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Tributada no Mercado Interno"),
    /**
     * 61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno
     */
    COFINS_61("61", "COFINS 61 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita Não-Tributada no Mercado Interno"),
    /**
     * 62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação
     */
    COFINS_62("62", "COFINS 62 - Crédito Presumido - Operação de Aquisição Vinculada Exclusivamente a Receita de Exportação"),
    /**
     * 63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno
     */
    COFINS_63("63", "COFINS 63 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno"),
    /**
     * 64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação
     */
    COFINS_64("64", "COFINS 64 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas no Mercado Interno e de Exportação"),
    /**
     * 65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação
     */
    COFINS_65("65", "COFINS 65 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Não-Tributadas no Mercado Interno e de Exportação"),
    /**
     * 66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação
     */
    COFINS_66("66", "COFINS 66 - Crédito Presumido - Operação de Aquisição Vinculada a Receitas Tributadas e Não-Tributadas no Mercado Interno, e de Exportação"),
    /**
     * 67 - Crédito Presumido - Outras Operações
     */
    COFINS_67("67", "COFINS 67 - Crédito Presumido - Outras Operações"),
    /**
     * 70 - Operação de Aquisição sem Direito a Crédito
     */
    COFINS_70("70", "COFINS 70 - Operação de Aquisição sem Direito a Crédito"),
    /**
     * 71 - Operação de Aquisição com Isenção
     */
    COFINS_71("71", "COFINS 71 - Operação de Aquisição com Isenção"),
    /**
     * 72 - Operação de Aquisição com Suspensão
     */
    COFINS_72("72", "COFINS 72 - Operação de Aquisição com Suspensão"),
    /**
     * 73 - Operação de Aquisição a Alíquota Zero
     */
    COFINS_73("73", "COFINS 73 - Operação de Aquisição a Alíquota Zero"),
    /**
     * 74 - Operação de Aquisição sem Incidência da Contribuição
     */
    COFINS_74("74", "COFINS 74 - Operação de Aquisição sem Incidência da Contribuição"),
    /**
     * 75 - Operação de Aquisição por Substituição Tributária
     */
    COFINS_75("75", "COFINS 75 - Operação de Aquisição por Substituição Tributária"),
    /**
     * 98 - Outras Operações de Entrada
     */
    COFINS_98("98", "COFINS 98 - Outras Operações de Entrada"),
    /**
     * 99 - Outras Operações
     */
    COFINS_99("99", "COFINS 99 - Outras Operações");
    private String cst;
    private String descricao;

    private COFINSEnum(String codigo, String descricao) {
        this.cst = codigo;
        this.descricao = descricao;
    }

    /**
     * Descrição.
     */
    public String getDescricao() {
        return this.descricao;
    }

    /**
     * Código do COFINS.
     */
    public String getCST() {
        return this.cst;
    }

    @Override
    public String toString() {
        return getDescricao();
    }

    /**
     * Obtém enum pelo código.
     */
    public static COFINSEnum getEnumByCodigo(String codigo) {
        for (COFINSEnum e : values()) {
            if (e.getCST().equals(codigo)) {
                return e;
            }
        }
        return null;
    }
}
